package pers.qianyu.util;


import cn.hutool.core.util.*;
import pers.qianyu.constants.*;

import java.time.*;
import java.time.format.*;
import java.util.*;

/**
 * 处理时间和日期
 *
 * @author mizzle rain
 * @date 2020-10-30 12:28
 */
public class DateTimeUtil {
    /**
     * 以 Java8 的方式获取当前时间字符串
     *
     * @return 当前时间格式化之后的字符串
     */
    public static String now() {
        return LocalDateTime.now()
                .format(DateTimeFormatter.ofPattern(DateTimeConstants.DATE_TIME_PATTERN));
    }

    /**
     * 以 Java8 的方式将毫秒数转化为字符串，字符串格式：yyyy-MM-dd HH:mm:ss
     *
     * @param millis 毫秒数
     * @return 格式化之后的字符串
     */
    public static String formatDatetime(Long millis) {
        return formatDatetime(millis, DateTimeConstants.DATE_TIME_PATTERN);
    }

    /**
     * 以 Java8 的方式将 LocalDateTime 转化为字符串，字符串格式：yyyy-MM-dd HH:mm:ss
     *
     * @param localDateTime 时间
     * @return 格式化之后的字符串
     */
    public static String formatDatetime(LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ofPattern(DateTimeConstants.DATE_TIME_PATTERN));
    }

    /**
     * 以 Java8 的方式将毫秒数转化为字符串
     *
     * @param millis  毫秒数
     * @param pattern 格式
     * @return 格式化之后的字符串
     */
    public static String formatDatetime(Long millis, String pattern) {
        if (Objects.isNull(millis)) {
            return StrUtil.EMPTY;
        }
        Instant instant = Instant.ofEpochMilli(millis);
        LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("+8"));
        return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 以 Java8 的方式将字符串转换为 LocalDateTime
     *
     * @param dateTimeStr 字符串
     * @param pattern     格式
     * @return 转换之后的 LocalDateTime 对象
     */
    public static LocalDateTime parseDatetime(String dateTimeStr, String pattern) {
        return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 以 Java8 的方式将字符串转换为 LocalDateTime，字符串格式：yyyy-MM-dd HH:mm:ss
     *
     * @param dateTimeStr 字符串
     * @return 转换之后的 LocalDateTime 对象
     */
    public static LocalDateTime parseDatetime(String dateTimeStr) {
        return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(DateTimeConstants.DATE_TIME_PATTERN));
    }

    /**
     * 以 Java8 的方式将毫秒数转化为字符串，字符串格式：yyyy-MM-dd
     *
     * @param millis 毫秒数
     * @return 格式化之后的字符串
     */
    public static String formatDate(Long millis) {
        return formatDatetime(millis, DateTimeConstants.DATE_PATTERN);
    }

    /**
     * 将 LocalDateTime 类型转换为毫秒数
     *
     * @param localDateTime LocalDateTime 类型的时间
     * @return 毫秒数
     */
    public static long toMillis(LocalDateTime localDateTime) {
        return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
    }

    /**
     * 将字符串类型的时间转换为毫秒数
     *
     * @param dateTimeStr 表示时间的字符串
     * @return 毫秒数
     */
    public static long toMillis(String dateTimeStr) {
        LocalDateTime localDateTime = parseDatetime(dateTimeStr);
        return toMillis(localDateTime);
    }

    /**
     * 将字符串类型的时间转换为毫秒数
     *
     * @param dateTimeStr 表示时间的字符串
     * @param pattern     时间格式
     * @return 毫秒数
     */
    public static long toMillis(String dateTimeStr, String pattern) {
        LocalDateTime localDateTime = parseDatetime(dateTimeStr, pattern);
        return toMillis(localDateTime);
    }
}
